package com.hanser.hancoder.config;

import com.hanser.hancoder.monitor.AiModelMetricsCollector;
import com.hanser.hancoder.monitor.AiModelMonitorListener;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
import jakarta.annotation.Resource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import java.util.List;

@Configuration
@ConfigurationProperties(prefix = "langchain4j.open-ai.streaming-chat-model")
@Data
public class StreamingChatModelConfig {

    /**
     * OpenAI API 的基础 URL 地址
     */
    private String baseUrl;

    /**
     * OpenAI API 的访问密钥
     */
    private String apiKey;

    /**
     * 使用的模型名称
     */
    private String modelName;

    /**
     * 单次请求的最大 token 数量
     */
    private Integer maxTokens;

    /**
     * 采样温度，控制生成文本的随机性
     */
    private Double temperature;

    /**
     * 是否记录请求日志
     */
    private boolean logRequests;

    /**
     * 是否记录响应日志
     */
    private boolean logResponses;

    @Resource
    private AiModelMonitorListener aiModelMonitorListener;

    @Bean
    @Scope("prototype")
    public StreamingChatModel streamingChatModelPrototype() {
        return OpenAiStreamingChatModel.builder()
                .apiKey(apiKey)
                .baseUrl(baseUrl)
                .modelName(modelName)
                .maxTokens(maxTokens)
                .temperature(temperature)
                .logRequests(logRequests)
                .logResponses(logResponses)
                .listeners(List.of(aiModelMonitorListener))
                .build();
    }
}
